package uy.org.softtech.cssuite.entidad.cliente;

import static uy.org.softtech.cssuite.entidad.Entidad.CLIENTE_NAMESPACE;

import java.io.Serializable;

import javax.persistence.Column;
import javax.persistence.DiscriminatorValue;
import javax.persistence.Entity;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

import org.codehaus.jackson.map.annotate.JsonRootName;
import org.codehaus.jackson.map.annotate.JsonSerialize;
import org.codehaus.jackson.map.annotate.JsonSerialize.Inclusion;

/**
 * <p>Entidad que representa a una empresa como cliente. También mapea la declaración del tipo de dato XML 'empresa'.</p>
 * 
 * <p>El siguiente fragmento de esquema especifica el contenido esperado y representado por los atributos de esta clase.</p>
 *  
 * <pre>
 * &lt;xsd:complexType name="empresa">
 *  &lt;xsd:all>
 *   &lt;xsd:element name="id" type="xsd:ID"/>
 *   &lt;xsd:element name="nombre" type="{http://cssuite.softtech.org.uy/esquemas/tipos}nombre"/>
 *   &lt;xsd:element name="razonSocial" type="{http://cssuite.softtech.org.uy/esquemas/tipos}texto"/>
 *   &lt;xsd:element name="url" type="xsd:anyURI" minOccurs="0" />
 *   &lt;xsd:element name="bloqueado" type="xsd:boolean"/>
 *   &lt;xsd:element name="comentarios" type="{http://cssuite.softtech.org.uy/esquemas/tipos}comentario" minOccurs="0"/>
 *   &lt;xsd:element name="cuentas">
 *    &lt;xsd:complexType>
 *     &lt;xsd:sequence>
 *      xsd:element name="cuenta" type="{http://cssuite.softtech.org.uy/esquemas/entidades}cuenta" maxOccurs="unbounded" />
 *     &lt;/xsd:sequence>
 *    &lt;/xsd:complexType>
 *   &lt;/xsd:element>
 *  &lt;/xsd:all>
 * &lt;/xsd:complexType>
 * 
 * </pre>
 *
 * @author fabian.lobo
 */
@Entity
@DiscriminatorValue("EMPRESA")
@JsonRootName(value = "empresa")
@JsonSerialize(include = Inclusion.NON_NULL)
@XmlType(name = "empresa", namespace = CLIENTE_NAMESPACE, propOrder = {})
public class Empresa extends Cliente implements Serializable {

	private static final long serialVersionUID = -4986413390495740400L;
	
	@Column(name = "NOMBRE", length = 25, nullable = false)
	@XmlElement(name = "nombre", namespace = CLIENTE_NAMESPACE, required = true)
	private String nombre;
	
	@Column(name = "RAZON_SOCIAL", length = 255, nullable = true)
	@XmlElement(name = "razonSocial", namespace = CLIENTE_NAMESPACE, required = true)
	private String razonSocial;
	
	@Column(name = "RUT", length = 25, nullable = true)
	@XmlTransient
	private String rut;
	
	@Column(name = "URL", length = 255, nullable = true)
	@XmlElement(name = "url", required = false)
	private String url;
	
	public Empresa() {
		setTipo(Tipo.EMPRESA);
	}

	/*
	 *  GETTERS
	 */
	public String getNombre() {
		return nombre;
	}
	public String getRazonSocial() {
		return razonSocial;
	}
	public String getRut() {
		return rut;
	}
	public String getUrl() {
		return url;
	}

	/*
	 *  SETTERS
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}
	public void setRazonSocial(String razonSocial) {
		this.razonSocial = razonSocial;
	}
	public void setRut(String rut) {
		this.rut = rut;
	}
	public void setUrl(String url) {
		this.url = url;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 6;
		result = prime * result + ((getId() == null) ? 0 : getId().hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		Empresa otro = (Empresa) obj;
		if (getId() != null && otro.getId() != null && getId().equals(otro.getId())) {
			return true;
		}
		return false;
	}

	@Override
	public String toString() {
		StringBuilder builder = new StringBuilder();
		builder.append("Empresa [");
		builder.append("id=" + getId() + ", ");
		builder.append("nombre=" + getNombre() + ", ");
		builder.append("razonSocial=" + getRazonSocial() + ", ");
		builder.append("rut=" + getRut() + ", ");
		builder.append("url=" + getUrl() + ", ");
		builder.append("eliminado=" + isEliminado() + ", ");
		builder.append("bloqueado=" + isBloqueado() + ", ");
		builder.append("comentarios=" + getComentarios());
		builder.append("]");
		return builder.toString();
	}

	@Override
	public String toString(boolean incluirColecciones) {
		StringBuilder result = new StringBuilder(toString());
		
		if(incluirColecciones) {
			int offset = result.length() - 2;
			StringBuilder builder = new StringBuilder(", ");
			builder.append("cuentas=" + getCuentas());
			result.insert(offset, builder.toString());
		}	
				
		return result.toString();
	}

}
